package com.tensquare.mq.producer;

import com.tensquare.mq.cofig.MqConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;


    /**  todo 直接模式
     * 我们需要将消息发给唯一一个节点时使用这种模式，这是最简单的一种形式。
     * 任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
     * 1.一般情况可以使用rabbitMQ自带的Exchange：""(该Exchange的名字为空字符串，下
     * 文称其为default Exchange)。
     * 2.这种模式下不需要将Exchange进行任何绑定(binding)操作
     * 3.消息传递时需要一个“RouteKey”，可以简单的理解为要发送到的队列名字。
     * 4.如果vhost中不存在RouteKey中指定的队列名，则该消息会被抛弃。
     * @param massage
     */
    public void send2DirectTestQueue(String massage){
        rabbitTemplate.convertAndSend(MqConfig.TEST_DIRECT_EXCHANGE,
                MqConfig.DIRECT_ROUTINGKEY, massage);
    }

    /**  todo 分裂模式
     * 当我们需要将消息一次发给多个队列时，需要使用分裂模式
     *      任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上。
     *      * 1.可以理解为路由表的模式
     *      * 2. todo 这种模式不需要RouteKey 默认所有队列都发送
     *      * 3.这种模式需要提前将Exchange与Queue进行绑定，一个Exchange可以绑定多个
     *      4.如果接受到消息的Exchange没有与任何Queue绑定，则消息会被抛弃。
     *      * Queue，一个Queue可以同多个Exchange进行绑定。 多对多
     * @param massage
     */
    public void send2FanoutTestQueue(String massage){
        rabbitTemplate.convertAndSend(MqConfig.TEST_FANOUT_EXCHANGE,
                "", massage);
    }


    /**
     *  todo 主题模式
     * 注：
     * 交换器说到底是一个名称与队列绑定的列表。当消息发布到交换器时，实际上是由你所
     * 连接的信道，将消息路由键同交换器上绑定的列表进行比较，最后路由消息。
     *
     * 任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上
     *1.这种模式较为复杂，简单来说，就是每个队列都有其关心的主题，所有的消息都带有一
     * 个“标题”(RouteKey)，Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的
     * 队列。
     * 2.这种模式需要RouteKey，也许要提前绑定Exchange与Queue。
     * 3.在进行绑定时，要提供一个该队列关心的主题，如“#.log.#”表示该队列关心所有涉及
     * log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。
     * 4.“#”表示0个或若干个关键字，“”表示一个关键字。如“log.”能与“log.warn”匹配，无法
     * 与“log.warn.timeout”匹配；但是“log.#”能与上述两者匹配。
     * 5.同样，如果Exchange没有发现能够与RouteKey匹配的Queue，则会抛弃此消息
     *
     * 主题模式指定routingKey
     * @param massage
     */
    public void send2TopicTestAQueue(String massage){
        rabbitTemplate.convertAndSend(MqConfig.TEST_TOPIC_EXCHANGE,
                "test.aaa", massage);
    }

    /**
     * 主题模式指定routingKey
     * @param massage
     */
    public void send2TopicTestBQueue(String massage){
        rabbitTemplate.convertAndSend(MqConfig.TEST_TOPIC_EXCHANGE,
                "test.bbb", massage);
    }

}
